package cn.cy.creation.d04;

public class Client {

    /**
     * 抽象工厂：银行（Bank）
     * 具体工厂：招商银行（MerBank）、浦发银行（DevBank）
     * 抽象产品：封闭式理财产品（SealProduct）、开放式理财产品（OpenProduct）
     * 具体产品：
     *      MerBank：固定收益类封闭式理财产品（FixedSealProduct）、固定收益类开放式理财产品（FixedOpenProduct）
     *      DevBank：浮动收益类封闭式理财产品（FloatSealProduct）、浮动收益类开放式理财产品（FloatOpenProduct）
     * 用户：银行只发行理财产品，用户让银行发行理财产品、用户使用产品赚取收益
     */

    // 0 客户
    public static void main(String[] args) {
        Bank bank = (Bank) ReadXML2.getInstanceByNameFromConfigFile();
        SealProduct sealProduct = bank.newSealProduct();
        OpenProduct openProduct = bank.newOpenProduct();
        sealProduct.invest();
        openProduct.invest();
    }

    // 1 抽象工厂
    interface Bank {
        // 发行封闭式理财产品
        SealProduct newSealProduct();
        // 发行开放式理财产品
        OpenProduct newOpenProduct();
    }

    // 2 具体工厂1
    class MerBank implements Bank {
        @Override
        public SealProduct newSealProduct() {
            System.out.println("发行固定收益类封闭式理财产品...");
            return new FixedSealProduct();
        }

        @Override
        public OpenProduct newOpenProduct() {
            System.out.println("发行固定收益类开放式理财产品...");
            return new FixedOpenProduct();
        }
    }

    // 2 具体工厂2
    class DevBank implements Bank {
        @Override
        public SealProduct newSealProduct() {
            System.out.println("发行浮动收益类封闭式理财产品...");
            return new FloatSealProduct();
        }

        @Override
        public OpenProduct newOpenProduct() {
            System.out.println("发行浮动收益类开放式理财产品...");
            return new FloatOpenProduct();
        }
    }

    // 3 抽象产品1
    interface SealProduct {
        void invest();
    }

    // 3 抽象产品2
    interface OpenProduct {
        void invest();
    }

    // 4 具体产品11（FixedSealProduct）
    class FixedSealProduct implements SealProduct {
        @Override
        public void invest() {
            System.out.println("固定收益类封闭式理财产品-->赚取收益11w...");
        }
    }

    // 4 具体产品12（FloatSealProduct）
    class FloatSealProduct implements SealProduct {
        @Override
        public void invest() {
            System.out.println("浮动收益类封闭式理财产品-->赚取收益12w...");
        }
    }

    // 4 具体产品21（FixedOpenProduct）
    class FixedOpenProduct implements OpenProduct {
        @Override
        public void invest() {
            System.out.println("固定收益类开放式理财产品-->赚取收益21w...");
        }
    }

    // 4 具体产品22（FloatOpenProduct）
    class FloatOpenProduct implements OpenProduct {
        @Override
        public void invest() {
            System.out.println("浮动收益类开放式理财产品-->赚取收益22w...");
        }
    }

}
